from Camera import Camera
import cv2

import numpy as np



class ImageCorrector:
    """
    加载左右拼接的原始图像
    分割为左右图像
    初始化 Camera 类
    应用映射矩阵校正
    绘制水平线验证对齐效果
    """
    def __init__(self,img,file_path):
        self.file_path = file_path # 读取左右拼接的原始图像（如 1280x480）
        self.img = cv2.imread(img)
        if self.img is None:
            raise ValueError("无法加载图像，请检查路径！")
        self.size = self.get_image_size(self.img)
        """
        根据图像尺寸分割左右图像（示例中假定左图 640x480，右图 640x480）
        """
        width,height = self.size# 获取图像尺寸（width, height）
        mid = width // 2  # 计算中点
        img_left = self.img[:, :mid]  # 取左半部分
        img_right = self.img[:, mid:] #取右图像
        # 初始化 Camera 对象，加载校准参数并计算校正映射矩阵
        camera = Camera(self.file_path, (self.size[0]//2,self.size[1]))
        """
        X_rectified 是矫正后的图像
        """
        self.left_rectified = cv2.remap(img_left, camera.left_map1, camera.left_map2, cv2.INTER_LINEAR)
        self.right_rectified = cv2.remap(img_right, camera.right_map1, camera.right_map2, cv2.INTER_LINEAR)

    def draw_horizontal_lines(self, image, num_lines=10, color=(0, 255, 0), thickness=1):
        """
        在图像上绘制水平线，便于观察校正效果。
        :param image: 输入图像
        :param num_lines: 要绘制的水平线数量
        :param color: 线条颜色 (B, G, R)
        :param thickness: 线条厚度
        :return: 带有水平线的图像
        """
        height, width = image.shape[:2]
        interval = height // (num_lines + 1)  # 水平线间距
        for i in range(1, num_lines + 1):
            y = i * interval
            cv2.line(image, (0, y), (width, y), color, thickness)
        return image

    def showLineAlignment(self):
        # 在校正后的左右图像绘制水平线
        """
        self.left_rectified.copy() 和 self.right_rectified.copy()
        分别是图像 left_rectified 和 right_rectified 的副本
        使用 copy() 避免修改原图
        """
        rectified_left_with_lines =self.draw_horizontal_lines(self.left_rectified.copy())
        rectified_right_with_lines = self.draw_horizontal_lines(self.right_rectified.copy())
        # 合并校正后的左右图像
        combined_rectified_image = np.hstack((rectified_left_with_lines, rectified_right_with_lines))

        # 显示校正前和校正后的图像
        cv2.imshow('original image', self.img)
        cv2.imshow('current image', combined_rectified_image)
        # 等待用户按键并退出
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    def get_image_size(self,img):
        #读取图片的尺寸
        if img is not None:
            return (img.shape[1], img.shape[0])  # (width, height)
        else:
            raise ValueError(f"无法读取图像: {img}")